package pck_tramitedocu.pck_web;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import pck_tramitedocu.pck_src.pck_pojos.Cls_Trabajador;
import pck_tramitedocu.pck_src.pck_pojos.Cls_documento_extension;
import pck_tramitedocu.pck_src.pck_pojos.TramiteDocuException;
import pck_tramitedocu.pck_src.pck_utiles.Cls_Parametros;
import pck_tramitedocu.pck_src.pck_utiles.Cls_Seguridad_DESBase64;
import pck_tramitedocu.pck_src.pck_utiles.cls_utilitarios;

public class svl_gestion_genera_flash extends HttpServlet {

    private ServletConfig conf;
    private static ServletConfig confStatic;

    public void init(ServletConfig config)
            throws ServletException {
        this.conf = config;
        confStatic = config;
        super.init(config);
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String nombre_archivo_pdf = cls_utilitarios.utf8_decode(request.getParameter(Cls_Parametros.Request_Codigo_DOCUMENTO));
        try {
            String is_documento_externo = request.getParameter(Cls_Parametros.Request_Codigo_OPERACION);
            String dni_usuario_upload_archvivo = ((Cls_Trabajador) request.getSession().getAttribute(Cls_Parametros.Session_OBJETO_USUARIO)).getCodigo();
            if (is_documento_externo != null && is_documento_externo.compareToIgnoreCase("E") == 0) {
                generarPdfDesdeDni(dni_usuario_upload_archvivo, nombre_archivo_pdf);
                return;
            }
        } catch (NullPointerException ex) {
            ex.printStackTrace();
        }
        try {
            String operacion_delete = request.getParameter("jhfdfgsdfsfs");
            String dni_usuario_upload_archvivo = ((Cls_Trabajador) request.getSession().getAttribute("usuarioObjeto")).getCodigo();
            if (operacion_delete != null && operacion_delete.compareToIgnoreCase("eliminar") == 0) {
                if (new File(dni_usuario_upload_archvivo).exists()) {
                    eliminarPdfDesdeDni(dni_usuario_upload_archvivo);
                }
                return;
            }
        } catch (NullPointerException ex) {
        }
        String[] parametrosParaFacade_01 = {Cls_Parametros.Map_NUMERO_DOCUMENTO, new Cls_Seguridad_DESBase64().desencriptar(nombre_archivo_pdf)};
        Map map = cls_utilitarios.generarHashMapParaRequest(new String[][]{parametrosParaFacade_01});
        File archivo_pdf = new File(cls_utilitarios.getPathArchivoLinux("" + map.get(Cls_Parametros.Map_NUMERO_DOCUMENTO)));
        try {
            if (!archivo_pdf.exists()) {
                svl_gestion_facade_web_documento.crearDocumento("" + map.get(Cls_Parametros.Map_NUMERO_DOCUMENTO));
            }
            if (svl_gestion_facade_web.facadeInterface.necesitaGenerarFlashFacade(map)) {
                generarFlash(nombre_archivo_pdf);
                map.put(Cls_Parametros.Funcion_REALIZAR_FLASH, "true");
                map.put(Cls_Parametros.Funcion_REALIZAR_PROCEDIMIENTO_MAP, Cls_Parametros.SP_Funcion_NECITA_FLASH);
                svl_gestion_facade_web.facadeInterface.necesitaGenerarFlashFacade(map);
            } else if (!existeArchivoFlash(nombre_archivo_pdf)) {
                generarFlash(nombre_archivo_pdf);
            }

            String url = "";

            boolean is_from_bandeja = false;
            try {
                is_from_bandeja = Boolean.parseBoolean(request.getParameter(Cls_Parametros.Request_OPT_HTML));
            } catch (NullPointerException ex) {
            }
            String codigo_documento_desencriptado = new Cls_Seguridad_DESBase64().desencriptar(nombre_archivo_pdf);
            String[] codigo_documento_array = codigo_documento_desencriptado.split("-");
            Map mapa = new HashMap();
            mapa.put(Cls_Parametros.Map_TIPO_DOCUMENTO, codigo_documento_array[0]);
            mapa.put(Cls_Parametros.Map_NUMERO_DOCUMENTO, codigo_documento_array[1]);
            mapa.put(Cls_Parametros.Map_ANHIO_DOCUMENTO, codigo_documento_array[2]);
            mapa.put(Cls_Parametros.Map_DNI, ((Cls_Trabajador) request.getSession().getAttribute(Cls_Parametros.Session_OBJETO_USUARIO)).getCodigo());
            int puedeImprimir = svl_gestion_facade_web.facadeInterface.puedeImprimirDocumentoFacade(mapa);
            url = is_from_bandeja ? "/VisualizarEnBandeja.jsp" : "/Visualizar.jsp";
            request.setAttribute("fadfdsfsdfadsa", nombre_archivo_pdf);
            request.getSession().setAttribute("docu_impri", Integer.valueOf(puedeImprimir));
            getServletConfig().getServletContext().getRequestDispatcher(url).forward(request, response);
        } catch (TramiteDocuException ex) {
            
        }
    }

    private void generarPdfDesdeDni(String dni, String cod_archivo) {
        String cadena = "";
        String codigo_documento = cod_archivo;
        String[] codigo_documento_array = codigo_documento.split("-");
        String rutapdf = Cls_Parametros.RUTA_DOCUMENTOS_SERVIDOR2 + dni + ".pdf";
        String rutafinal = Cls_Parametros.RUTA_DOCUMENTOS_SERVIDOR2 + codigo_documento_array[2] + 
                (isSistemaWindow() ? "\\" : "/") + codigo_documento + ".pdf";
        if (isSistemaWindow()) {
            cadena = "cmd /c move \"" + rutapdf + "\" " + " \"" + rutafinal + "\"";
        } else {
            cadena = "mv " + rutapdf + " " + " " + rutafinal + "";
        }
        ejecutarComando(cadena);
        System.gc();
    }

    public static void generarFlash(String archivo) {
        String codigo_documento = cls_utilitarios.utf8_decode(new Cls_Seguridad_DESBase64().desencriptar(archivo));
        String[] codigo_documento_array = codigo_documento.split("-");
        String rutapdf = Cls_Parametros.RUTA_DOCUMENTOS_SERVIDOR2 + codigo_documento_array[2] +
                (isSistemaWindow() ? "\\" : "/") + codigo_documento + ".pdf";
        String rutafinal = confStatic.getServletContext().getRealPath("fileswf") + 
                (isSistemaWindow() ? "\\" : "/") + codigo_documento + ".swf";
        String cadena = (isSistemaWindow() ? "pdf2swf -o \"" + rutafinal + "\" \"" + rutapdf + "\" -T 9 -f"
                : "pdf2swf -o " + rutafinal + " " + rutapdf + " -T 9 -f");
        ejecutarComando(cadena);
//        if (isSistemaWindow()) {
//            ejecutarComando("cmd c/ del " + rutapdf);
//        } else {
//            ejecutarComando("rm " + rutapdf);
//        }
        System.gc();
    }

    public static String generarFlashParaVistaPrevia(String archivo) {
        String retorno = null;
        String codigo_documento = archivo;
        String rutapdf = Cls_Parametros.RUTA_DOCUMENTOS_SERVIDOR2 + codigo_documento + ".pdf";
        javax.servlet.ServletConfig config = confStatic;
        javax.servlet.ServletContext context = config.getServletContext();
        String rutafinal = context.getRealPath("fileswf") +
                (isSistemaWindow() ? "\\" : "/") + codigo_documento + ".swf";
        String cadena = (isSistemaWindow() ? "pdf2swf -o \"" + rutafinal + "\" \"" + rutapdf + "\" -T 9 -f"
                : "pdf2swf -o " + rutafinal + " " + rutapdf + " -T 9 -f");
        ejecutarComando(cadena);
        retorno = "VisualizarVistaPrevia.jsp?fadfdsfsdfadsa=" + new Cls_Seguridad_DESBase64().encriptar(codigo_documento);
        System.gc();
        return retorno;
    }

    public static boolean existeArchivoFlash(String nombre_archivo) {
        ServletContext sc = confStatic.getServletContext();
        String directorioArchivos = sc.getRealPath("/") + "fileswf";
        File file = new File(directorioArchivos);
        File[] flash_generados = file.listFiles();
        for (int i = 0; i < flash_generados.length; i++) {
            String archivo_con_extension = flash_generados[i].getName();
            String archivo_sin_extension = archivo_con_extension.substring(0, archivo_con_extension.indexOf('.'));
            if (new Cls_Seguridad_DESBase64().desencriptar(nombre_archivo).compareToIgnoreCase(archivo_sin_extension) == 0) {
                return true;
            }
        }
        return false;
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    private void eliminarPdfDesdeDni(String dni_usuario_upload_archvivo) {
        String comando = "";
        String cadena = "";
        if (isSistemaWindow()) {
            comando = "cmd /c del /Q ";
        } else {
            comando = "rm ";
        }
        cadena = comando + Cls_Parametros.RUTA_DOCUMENTOS_SERVIDOR2 + dni_usuario_upload_archvivo + "*.*";
        ejecutarComando(cadena);
        cadena = comando + " \"" + confStatic.getServletContext().getRealPath("fileswf") + "/" + "\"" + dni_usuario_upload_archvivo + "_VP*.*";
        ejecutarComando(cadena);
        System.gc();
    }

    public static void moverPdfDesdeDni(String codigo_documento, String dni_usuario_upload_archvivo, ArrayList<Cls_documento_extension> extensiones) {
        ArrayList<Cls_documento_extension> extensiones_array = extensiones;
        String[] codigo_array = codigo_documento.split("-");
        int i = 1;
        for (Cls_documento_extension extension : extensiones_array) {
            String nombre_archivo = extension.getNombre();
            String codigo_archivo = extension.getId();
            String cadena = "";
            if (isSistemaWindow()) {

                cadena = "cmd /c move \"" + Cls_Parametros.RUTA_DOCUMENTOS_SERVIDOR2 + dni_usuario_upload_archvivo + "_I_" + codigo_archivo + nombre_archivo.substring(nombre_archivo.lastIndexOf("."), nombre_archivo.length() - 1) + "\" \"" + Cls_Parametros.RUTA_DOCUMENTOS_SERVIDOR2 + codigo_array[2] + "\\" + codigo_documento + "_I_" + i + nombre_archivo.substring(nombre_archivo.lastIndexOf("."), nombre_archivo.length() - 1) + "\"";
            } else {
                cadena = "mv " + Cls_Parametros.RUTA_DOCUMENTOS_SERVIDOR2 + dni_usuario_upload_archvivo + "_I_" + codigo_archivo + nombre_archivo.substring(nombre_archivo.lastIndexOf("."), nombre_archivo.length() - 1) + " " + Cls_Parametros.RUTA_DOCUMENTOS_SERVIDOR2 + codigo_array[2] + "/" + codigo_documento + "_I_" + i + nombre_archivo.substring(nombre_archivo.lastIndexOf("."), nombre_archivo.length() - 1);
            }
            ejecutarComando(cadena);
            i++;
        }
        System.gc();
    }

    public static void ejecutarComando(String command) {
        Process p;
        try {
            p = Runtime.getRuntime().exec(command);
            p.waitFor();
        } catch (Exception exception) {
            Logger.getLogger(svl_gestion_genera_flash.class.getName()).log(Level.SEVERE, null, exception);
        }
    }

    public static boolean isSistemaWindow() {
        String sistemaOperativo = System.getProperty("os.name");
        if (sistemaOperativo.toUpperCase().startsWith("WINDOW")) {
            return true;
        }
        return false;
    }
}
